//package com.xx.baogao.dame;
//
//import org.apache.poi.xwpf.usermodel.*;
//import java.io.*;
//import java.util.*;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
//
//public class ComplexTableFiller {
//
//    public static void main(String[] args) {
//        String templatePath = "C:\\Users\\admin\\Desktop\\模板.docx";
//        String outputPath = "E:\\word\\填充后的报告.docx";
//
//        try {
//            // 读取模板文件
//            FileInputStream fis = new FileInputStream(templatePath);
//            XWPFDocument doc = new XWPFDocument(fis);
//
//            // 准备填充数据
//            List<DetectionProject> projects = prepareDetectionData();
//
//            // 替换检测方案表格
//            replaceDetectionTable(doc, projects);
//
//            // 保存填充后的文档
//            FileOutputStream fos = new FileOutputStream(outputPath);
//            doc.write(fos);
//            fos.close();
//            fis.close();
//
//            System.out.println("文档填充完成，已保存到: " + outputPath);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static List<DetectionProject> prepareDetectionData() {
//        List<DetectionProject> projects = new ArrayList<>();
//
//        // 第一个项目类别 - 水质检测
//        DetectionProject waterProject = new DetectionProject();
//        waterProject.setProjectType("水质检测");
//        List<DetectionPoint> waterPoints = new ArrayList<>();
//        waterPoints.add(new DetectionPoint("A区采样点", "pH值, COD", "3次/天"));
//        waterPoints.add(new DetectionPoint("A区采样点", "BOD5, 氨氮", "2次/天"));
//        waterPoints.add(new DetectionPoint("B区采样点", "重金属含量", "1次/天"));
//        waterProject.setPoints(waterPoints);
//        projects.add(waterProject);
//
//        // 第二个项目类别 - 空气质量检测
//        DetectionProject airProject = new DetectionProject();
//        airProject.setProjectType("空气质量检测");
//        List<DetectionPoint> airPoints = new ArrayList<>();
//        airPoints.add(new DetectionPoint("厂区东侧", "PM2.5, PM10", "每小时1次"));
//        airPoints.add(new DetectionPoint("厂区西侧", "SO2, NO2", "每2小时1次"));
//        airProject.setPoints(airPoints);
//        projects.add(airProject);
//
//        return projects;
//    }
//
//    private static void replaceDetectionTable(XWPFDocument doc, List<DetectionProject> projects) {
//        for (XWPFTable table : doc.getTables()) {
//            if (isDetectionTable(table)) {
//                // 保留表头行
//                XWPFTableRow headerRow = table.getRow(0);
//
//                // 清除表格中除表头外的所有行
//                while (table.getRows().size() > 1) {
//                    table.removeRow(1);
//                }
//
//                // 添加项目数据行并记录合并范围
//                Map<String, List<Integer>> mergeRanges = new HashMap<>();
//                int currentRow = 1; // 从第二行开始（表头是第一行）
//
//                for (DetectionProject project : projects) {
//                    int startRow = currentRow;
//                    boolean isFirstRow = true;
//
//                    for (DetectionPoint point : project.getPoints()) {
//                        XWPFTableRow newRow = table.createRow();
//
//                        // 如果是该项目的第一行，显示项目类别并设置居中
//                        if (isFirstRow) {
//                            XWPFTableCell typeCell = getOrCreateCell(newRow, 0);
//                            setCellValue(typeCell, project.getProjectType());
//                            setCellCenterAlignment(typeCell);
//                            isFirstRow = false;
//                        } else {
//                            setCellValue(getOrCreateCell(newRow, 0), "");
//                        }
//
//                        // 设置其他列数据
//                        setCellValue(getOrCreateCell(newRow, 1), point.getPointName());
//                        setCellValue(getOrCreateCell(newRow, 2), point.getDetectProject());
//                        setCellValue(getOrCreateCell(newRow, 3), point.getCount());
//
//                        currentRow++;
//                    }
//
//                    // 记录需要合并的行范围（只有多于1行时才需要合并）
//                    if (currentRow - startRow > 1) {
//                        mergeRanges.put(project.getProjectType(), Arrays.asList(startRow, currentRow - 1));
//                    }
//                }
//
//                // 合并相同项目类别的单元格
//                for (List<Integer> range : mergeRanges.values()) {
//                    mergeCellsVertically(table, 0, range.get(0), range.get(1));
//                }
//
//                break;
//            }
//        }
//    }
//
//    /**
//     * 垂直合并单元格
//     * @param table 表格对象
//     * @param col 要合并的列索引
//     * @param startRow 起始行索引（从0开始）
//     * @param endRow 结束行索引（从0开始）
//     */
//    private static void mergeCellsVertically(XWPFTable table, int col, int startRow, int endRow) {
//        for (int rowIndex = startRow; rowIndex <= endRow; rowIndex++) {
//            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
//
//            // 获取或创建单元格属性
//            if (cell.getCTTc().getTcPr() == null) {
//                cell.getCTTc().addNewTcPr();
//            }
//
//            // 使用正确的合并常量
//            if (rowIndex == startRow) {
//                // 合并起始单元格
//                cell.getCTTc().getTcPr().addNewVMerge().setVal(STMerge.RESTART);
//            } else {
//                // 合并延续单元格
//                cell.getCTTc().getTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
//            }
//        }
//    }
//
//    /**
//     * 设置单元格内容居中（水平和垂直）
//     * @param cell 表格单元格
//     */
//    private static void setCellCenterAlignment(XWPFTableCell cell) {
//        if (cell == null) return;
//
//        // 水平居中
//        for (XWPFParagraph p : cell.getParagraphs()) {
//            p.setAlignment(ParagraphAlignment.CENTER);
//        }
//
//        // 垂直居中
//        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
//    }
//
//    /**
//     * 设置单元格值
//     * @param cell 表格单元格
//     * @param value 要设置的值
//     */
//    private static void setCellValue(XWPFTableCell cell, String value) {
//        if (cell == null) return;
//
//        // 清除单元格原有内容
//        for (int i = cell.getParagraphs().size() - 1; i >= 0; i--) {
//            cell.removeParagraph(i);
//        }
//
//        // 添加新内容
//        XWPFParagraph p = cell.addParagraph();
//        XWPFRun r = p.createRun();
//        r.setText(value == null ? "" : value);
//    }
//
//    /**
//     * 获取或创建单元格
//     * @param row 表格行
//     * @param cellIndex 单元格索引
//     * @return 单元格对象
//     */
//    private static XWPFTableCell getOrCreateCell(XWPFTableRow row, int cellIndex) {
//        XWPFTableCell cell = row.getCell(cellIndex);
//        if (cell == null) {
//            cell = row.createCell();
//        }
//        return cell;
//    }
//
//    /**
//     * 判断是否是检测方案表格
//     * @param table 表格对象
//     * @return 是否是检测方案表格
//     */
//    private static boolean isDetectionTable(XWPFTable table) {
//        if (table.getRows().size() > 0) {
//            XWPFTableRow firstRow = table.getRow(0);
//            if (firstRow.getTableCells().size() >= 4) {
//                String firstCellText = firstRow.getCell(0).getText();
//                return firstCellText != null && firstCellText.contains("项目类别");
//            }
//        }
//        return false;
//    }
//}
//
///**
// * 检测项目数据类
// */
//class DetectionProject {
//    private String projectType;
//    private List<DetectionPoint> points;
//
//    public DetectionProject() {}
//
//    public String getProjectType() {
//        return projectType;
//    }
//
//    public void setProjectType(String projectType) {
//        this.projectType = projectType;
//    }
//
//    public List<DetectionPoint> getPoints() {
//        return points;
//    }
//
//    public void setPoints(List<DetectionPoint> points) {
//        this.points = points;
//    }
//}
//
///**
// * 检测点位数据类
// */
//class DetectionPoint {
//    private String pointName;
//    private String detectProject;
//    private String count;
//
//    public DetectionPoint(String pointName, String detectProject, String count) {
//        this.pointName = pointName;
//        this.detectProject = detectProject;
//        this.count = count;
//    }
//
//    public String getPointName() {
//        return pointName;
//    }
//
//    public String getDetectProject() {
//        return detectProject;
//    }
//
//    public String getCount() {
//        return count;
//    }
//}